//
//  UserAccountViewModel.swift
//  CYMWeiBo-20
//
//  Created by mac on 15/12/16.
//  Copyright © 2015年 IT 小码农. All rights reserved.
//

import UIKit
import AFNetworking

//MARK:封装网络请求和业务逻辑
class UserAccountViewModel: NSObject {
    
    //定义用户模型对象的属性
    var userAccount: UserAccount?
    
    override init() {
        //对象的构造方法分两步 先构造本类 在构造父类
        //模型对象赋值  类名调用类方法  给属性赋值
        userAccount = UserAccount.loadAccount()
        super.init()
    }
    //计算性属性 用户是否登录  不为空 登陆成功
    var userLogin: Bool {
    return userAccount?.access_token != nil
    }
    
    
    //MARK: 加载用户 token 请求标识 access 入口,进入,访问
    func loadAccessToken(code: String,finished: (isSuccess: Bool) -> ()) {
        
        //发送 POST 请求
        /*
        1.获取授权的 url
        2.parameters参数,界限-->铺热米特--要一个字典,包含
        请求参数
        必选	    类型及范围	        说明
        client_id	    true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        grant_type	    true	string	请求的类型，填写authorization_code
        
        */
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        //这个字典包含五个参数
        /*
        POST
        请求参数
        必选	类型及范围	说明
        1.client_id	    true	string	申请应用时分配的AppKey。
        2.client_secret	true	string	申请应用时分配的AppSecret。
        3.grant_type	    true	string	请求的类型，填写authorization_code
        
        grant_type为authorization_code时
        必选	类型及范围	说明
        4.code	        true	string	调用authorize获得的code值。
        5.redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
        */
        let parameters = ["client_id" : client_id,"client_secret" : client_secret,"grant_type" : "authorization_code","code" : code,"redirect_uri" : redirect_url]
        
        //实例化拿到对象  任务管理
        let AFN = AFHTTPSessionManager()
        
        //添加纯文本类型 响应,串行器->C瑞拉伊Z 可接受->A可塞特伯 内容 类型
        AFN.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        AFN.POST(urlString, parameters: parameters, progress: { (p) -> Void in
            print(p)
            // _下划线表示忽略  result 是可选类型
            }, success: { (_, result) -> Void in
                //                print(result)
                
                //获取 token 成功-->获取用户信息 如果 result 有值就获取请求标识 token
                //判断 result 是否为空 不为空转换成可选<#T##[String : AnyObject]#>类型
                if let dict = result as? [String : AnyObject]{
                    //此时 token 是 AnyObeject 类型 调用方法需要的参数是String 类型
                    //                    let token = dict["access_token"] as! String
                    //                    let uid = dict["uid"] as! String
                    //用户账户 要的参数是<#T##[String : AnyObject]#>类型,而 result 是可选 AnyObject类型
                    let userAccount = UserAccount(dict: dict)//<#T##[String : AnyObject]#>
                    
                    
                    //调用加载用户信息方法  在闭包中要加 self 他能知道上下文再调用谁的方法 闭包会当做参水传递到其他地方,如果不加 self, 就不知道调用的谁的方法
                    self.loadUserInfo(userAccount, finished: finished)
                    
                    //                    print(userAccount)
                    
                }
            }) { (_, error) -> Void in
                print(error)
                finished(isSuccess: false)
        }
        
        //NSLocalizedDescription=Request failed: unacceptable content-type: text/plain}
        //本地化描述=请求失败：不能接受的内容类型：纯文本
    }
    
    
    //MARK:加载用户信息
    //必选类型的 String
    private func loadUserInfo(account: UserAccount,finished: (isSuccess: Bool) -> ()) {
        
        //拿到实例化任务管理对象
        let AFN = AFHTTPSessionManager()
        
        /*https://api.weibo.com/2/users/show.json?access_token=2.00zOnd_GymshlB2e47c0b7aeaP2c8E&uid=5787031453
        1.文档中微博 API 的 users/show,的 url
        2.两个参数,键值--->字典
        */
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        //字典中不能够存放 nil. 可以用[NSNull null]
        //如果 account.access_token 和 account.uid 都不为空就执行网络请求
        if  let token = account.access_token,userId = account.uid {
            let parameters = ["access_token" : token,"uid" : userId]
            
            //调用 GET 请求    _ 忽略
            AFN.GET(urlString, parameters: parameters, progress: { (_) -> Void in
                
                }, success: { (_, result) -> Void in
                    //                print(result)
                    
                    if let dict = result {
                        let avatar_large = dict["avatar_large"] as! String
                        let name = dict["name"] as! String
                        
                        //                    print(avatar_large,name)
                        //                    给 account 对象的属性做赋值操作
                        account.name = name
                        account.avatar_large = avatar_large
                        print(account)
                        
                        //获取用户信息的完整自定义对象
                        //存储自定义对象--->调用方法
                        account.saveAccount()
                        
                        //执行成功的回调
                        finished(isSuccess: true)
                    }
                }) { (_, error) -> Void in
                    print(error)
                    finished(isSuccess: false)
            }
        }
    }
    
}
